import uvicorn
from fastapi import FastAPI

app = FastAPI()


# 路径参数 item_id
# @app.get("/items/{item_id}")
# async def read_item(item_id):
#     return {"item_id": item_id}


# 指定类型的路径参数
# @app.get("/items/{item_id}/article/{num}")
# async def path_test(item_id: str, num: int):
#     return {"item_id": item_id, "num": num}


# 路径函数顺序问题
@app.get("/users/me")
async def read_user_me():
    return {"user_id": "the current user"}


@app.get("/users/{user_id}")
async def read_user(user_id: str):
    return {"user_id": user_id}


# 路径转换器
# 当你有一个路径是 /files/{file_path} ，但是不确定 file_path 到底会取什么值，并不是固定的长度，
# 可能是 /files/home/johndoe/myfile.txt 也可能是 /files/test/myfile.txt ，那怎么办呢？
# 路径转换器出来啦！  :path

# 路径转换器
@app.get("/files/{file_path:path}")
async def read_file(file_path: str):
    return {"file_path": file_path}


# 枚举类型的路径参数

from enum import Enum


# 自定义枚举类
class ModelName(Enum):
    polo = 'polo'
    yy = 'yy'
    test = 'test'


@app.get("/models/{model_name}")
# 类型限定为枚举类
async def get_model(model_name: ModelName):
    # 取枚举值方式一
    if model_name == ModelName.polo:
        return {"model_name": model_name, "message": "oh！！polo！！"}

    # 取枚举值方式二
    if model_name.value == "yy":
        return {"model_name": model_name, "message": "god！！yy"}

    return {"model_name": model_name, "message": "巴拉巴拉"}


'''
    重点：路径参数可以不传吗？
    先说答案，不行！路径参数是必传参数
'''

# 总结
# 路径参数是请求路径的一部分，如果不传，请求的是另一个路径，如果不存在就会 404

if __name__ == '__main__':
    uvicorn.run(app="main:app", host="127.0.0.1", port=8888, reload=True, debug=True)
